package collection;

import java.util.*;

/**
 *  排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(3,4));
        list.add(new Point(7,8));
        list.add(new Point(4,9));
        list.add(new Point(12,21));
        list.add(new Point(6,5));

        /*
            下面代码编译不通过,因为Collections.sort(List list)这个方法要求给定的集合中的元素
            必须实现接口:Comparable接口,这个接口是用来规定实现类是可以比较大小的.其中要求必须重
            写方法:compareTo用来定义该实例之间比较大小的规则.
            所以只有实现了该接口,sort方法才能利用元素中的compareTo方法在它们之间比较大小从而进行排序.
         */
//        Collections.sort(list);

        /*
            重载的sort方法要求再传入一个参数:Comparator
            这是一个接口,用于临时定义一种比较规则,然后在排序的时候将其传入给sort方法,这时sort方法就
            不再要求集合元素必须实现Comparable接口了,而是利用给定的比较器将集合元素比较大小后进行排序.
            由于使用这个方法不再要求修改其他地方的代码,因此这个操作没有侵入性.
         */
//        Collections.sort(list,new Comparator<Point>() {
//            public int compare(Point o1, Point o2) {
//                int olen1 = o1.getX()*o1.getX() + o1.getY()*o1.getY();
//                int olen2 = o2.getX()*o2.getX() + o2.getY()*o2.getY();
//                return olen1-olen2;
//            }
//        });
        Collections.sort(list,
                (o1,o2) -> o1.getX()*o1.getX() + o1.getY()*o1.getY()
                        - o2.getX()*o2.getX() - o2.getY()*o2.getY()
        );
        System.out.println(list);
    }
}